Appendix C: R script applied (modified from Silva et al. 2016)
Silva DP, Vilela B, Buzatto BA, Moczek AP, Hortal J (2016)
Contextualized niche shifts upon independent invasions by the dung beetle Onthophagus taurus. Biol Invasions 18:3137–3148
install.packages("BIOMOD",repos="http://R-Forge.R-project.org")
install.packages("ade4")
install.packages("adehabitat")
install.packages("sp")
install.packages("gam")
install.packages("MASS")
install.packages("mvtnorm")
install.packages("gbm")
install.packages("dismo")
install.packages("knitr")
install.packages("spThin")
install.packages("rgeos")
install.packages("maptools")
install.packages("raster")
install.packages("ecospat")
install.packages("spThin")
install.packages("rgdal")
install.packages("riverplot")
library(BIOMOD)
library(ade4)
library(adehabitat)
library(sp)
library(gam)
library(MASS)
library(mvtnorm)
library(gbm)
library(dismo)
library(knitr)
library(spThin)
library(rgeos)
library(maptools)
library(raster)
library(ecospat)
library(spThin)
library(rgdal)
library(riverplot)
main.directory <- "E:/Lilium lancifolium/TEXT/Supplementary/RCode"
n.groups <- 5
g.names <- c("Native","Asia","AUS-NZ","Europe","USA-CA")
g.codenames <- c("Native","Asia","AUS-NZ","Europe","USA-CA")
g.colors <- c("green", "blue", "orange","pink3", "red" )
setwd(main.directory)
occ.points.1 <- read.table("occurrences_native.txt", sep = "\t", header = TRUE)
occ.points.2 <- read.table("occurrences_asia.txt", sep = "\t", header = TRUE)
occ.points.3 <- read.table("occurrences_australia.txt", sep = "\t", header = TRUE)
occ.points.4 <- read.table("occurrences_europe.txt", sep = "\t", header = TRUE)
occ.points.5 <- read.table("occurrences_usa.txt", sep = "\t", header = TRUE)
occ.points <- list(occ.points.1,occ.points.2,occ.points.3,occ.points.4,occ.points.5)
variables.file.type <- '.bil'
variables.path <- "./variables"
buffer.size <- 0.3
R <- 500
rep <- 100
occ.points.thin <- list()
for (i in 1:n.groups){
occ.points.thin[i] <- thin(occ.points[[i]], verbose = FALSE,
lat.col = "latitude",
long.col = "longitude",
spec.col = "species",
thin.par = 5,
reps = 1,
write.files = FALSE,
write.log.file = FALSE,
locs.thinned.list.return = TRUE,
out.dir = getwd(),
out.base = "ThinProcess")
}
data(wrld_simpl)
plot(wrld_simpl)
for (i in 1:n.groups){
points(occ.points.thin[[i]]$Longitude, occ.points.thin[[i]]$Latitude , col = g.colors[i], pch = 20, cex = 0.7)
}
number.occ <- list()
for (i in 1:n.groups) {
number.occ[[i]] <- c(g.names[i],nrow(occ.points.thin[[i]]))
}
print(number.occ)
variables.file.pattern <- paste('*',variables.file.type, sep="")
list.variables<- list.files(path = variables.path, pattern = variables.file.pattern, full.names=TRUE)
variables <- stack(list.variables)
plot(variables)
mcp <- function (xy) {
xy <- as.data.frame(coordinates(xy))
coords.t <- chull(xy[, 1], xy[, 2])
xy.bord <- xy[coords.t, ]
xy.bord <- rbind(xy.bord[nrow(xy.bord), ], xy.bord)
return(SpatialPolygons(list(Polygons(list(Polygon(as.matrix(xy.bord))), 1))))
}
lps <- getSpPPolygonsLabptSlots(wrld_simpl)
IDFourBins <- cut(lps[,1], range(lps[,1]), include.lowest=TRUE)
world <- unionSpatialPolygons(wrld_simpl, IDFourBins)
xy.mcp <- list()
back.env <- list()
spec.env <- list()
plot(wrld_simpl)
for(i in 1:n.groups) {
mcp.occ <- mcp(occ.points.thin[[i]])
xy.mcp.i <- gBuffer(mcp.occ, width = buffer.size)
proj4string(xy.mcp.i) <- proj4string(world)
xy.mcp[[i]] <- gIntersection(xy.mcp.i, world, byid=TRUE, drop_lower_td=TRUE)
back.env[[i]] <- na.exclude(do.call(rbind.data.frame, extract(variables, xy.mcp[[i]])))
spec.env[[i]] <- na.exclude(extract(variables, occ.points.thin[[i]]))
points(occ.points.thin[[i]], col = g.colors[i], pch = 20, cex = 0.7)
plot(xy.mcp[[i]], add = TRUE, border = g.colors[i], lwd = 2)
xy.mcp[[i]] <- as(xy.mcp[[i]], "SpatialPolygonsDataFrame")
shape.directory <- paste(getwd(),'/shapes',sep="")
if (i==1){ dir.create(shape.directory) }
setwd(shape.directory)
shape.name <- paste("shape_", g.names[i], sep="")
writeOGR(xy.mcp[[i]], dsn = '.', layer = shape.name, driver = "ESRI Shapefile")
setwd(main.directory)
}
all.back.env <- do.call(rbind.data.frame, back.env)
all.spec.env <- do.call(rbind.data.frame, spec.env)
data.env <- rbind(all.spec.env, all.back.env)
n.rows.spec.env <- list()
first.row.spec.env <- list()
for (i in 1:n.groups){
first.row.spec.env[i] <- do.call(sum, n.rows.spec.env)+1
n.rows.spec.env[i] <- nrow(spec.env[[i]])
}
n.rows.back.env <- list()
first.row.back.env <- list()
for (i in 1:n.groups){
first.row.back.env[i] <- do.call(sum, n.rows.spec.env)+1+do.call(sum,n.rows.back.env)
n.rows.back.env[i] <- nrow(back.env[[i]])
}
rows.spec.env <- list()
for (i in 1:n.groups){
first.row <- first.row.spec.env[[i]]
last.row <- first.row.spec.env[[i]] + n.rows.spec.env[[i]]-1
rows.spec.env[[i]] <- c(first.row:last.row)
}
rows.back.env <- list()
for (i in 1:n.groups){
first.row <- first.row.back.env[[i]]
last.row <- first.row.back.env[[i]] + n.rows.back.env[[i]]-1
rows.back.env[[i]] <- c(first.row:last.row)
}
w <- c(rep(0, nrow(all.spec.env)), rep(1, nrow(all.back.env)))
pca.cal <- dudi.pca(data.env, row.w = w, center = TRUE,
scale = TRUE, scannf = FALSE, nf = 2)
scores.spec <- list()
scores.back <- list()
for(i in 1:n.groups) {
scores.spec[[i]] <- pca.cal$li[rows.spec.env[[i]], ]
scores.back[[i]] <- pca.cal$li[rows.back.env[[i]], ]
}
total.scores.back <- do.call(rbind.data.frame, scores.back)
z <- list()
for(i in 1:n.groups) {
z[[i]] <- ecospat.grid.clim.dyn(total.scores.back,
scores.back[[i]],
scores.spec[[i]],
R = R)
}
D <- matrix(nrow = n.groups, ncol = n.groups)
rownames(D) <- colnames(D) <- g.codenames
unfilling <- stability <- expansion <- sim.d <- sim.s <- eq.d <- eq.s <- D
for(i in 2:n.groups) {
for(j in 1:(i - 1)) {
x1 <- z[[i]]
x2 <- z[[j]]
D[i, j] <- ecospat.niche.overlap (x1, x2, cor = TRUE)$D
eq.s[i, j] <- ecospat.niche.equivalency.test (x1, x2, rep, alternative = "greater")$p.I
eq.s[j, i] <- ecospat.niche.equivalency.test (x2, x1, rep, alternative = "greater")$p.I
eq.d[i, j] <- ecospat.niche.equivalency.test (x1, x2, rep, alternative = "lower")$p.I
eq.d[j, i] <- ecospat.niche.equivalency.test (x2, x1, rep, alternative = "lower")$p.I
sim.s[i, j] <- ecospat.niche.similarity.test (x1, x2, rep, alternative = "greater")$p.D
sim.s[j, i] <- ecospat.niche.similarity.test (x2, x1, rep, alternative = "greater")$p.D
sim.d[i, j] <- ecospat.niche.similarity.test (x1, x2, rep, alternative = "lower")$p.D
sim.d[j, i] <- ecospat.niche.similarity.test (x2, x1, rep, alternative = "lower")$p.D
index1 <- ecospat.niche.dyn.index (x1, x2,
intersection = NA)$dynamic.index.w
index2 <- ecospat.niche.dyn.index (x2, x1,
intersection = NA)$dynamic.index.w
expansion[i, j] <- index1[1]
stability[i, j] <- index1[2]
unfilling[i, j] <- index1[3]
expansion[j, i] <- index2[1]
stability[j, i] <- index2[2]
unfilling[j, i] <- index2[3]
}
}
kable(D, digits = 3, format = "markdown")
kable(eq.s, digits = 3, format = "markdown")
kable(eq.d, digits = 3, format = "markdown")
kable(sim.s, digits = 3, format = "markdown")
kable(sim.d, digits = 3, format = "markdown")
kable(unfilling, digits = 3, format = "markdown")
kable(expansion, digits = 3, format = "markdown")
kable(stability, digits = 3, format = "markdown")
plot.niche.all <- function(z, n.groups, g.names,
densidade,
n.degradation,
slope.degradation,
contornar,
prob.dens,
line.width.dens,
back,
prob.back.1,
prob.back.2,
line.width.back,
title,
g.colors,
add.plots, i) {
color.vector <- function(g.colors,n.degradation,prob.dens){
alpha.seq <- numeric(length=n.degradation+1)
alpha.x <- seq(0,1,(1/n.degradation))
for (j in 1:(n.degradation+1)){
alpha.seq[j] <- (slope.degradation^alpha.x[j]-1)/(slope.degradation-1)
}
col.vector <- numeric(n.degradation+1)
current.color <- col2rgb(g.colors)/255
for (j in 1:(n.degradation+1)){
col.vector[j] <- rgb(current.color[1, ], current.color[2, ], current.color[3, ], alpha = alpha.seq[j])
}
return(col.vector)
}
a <- colorRampPalette( c(color.vector(g.colors[i], n.degradation)), alpha = TRUE )
xlim <- c(min(sapply(z, function(x){min(x$x)})),
max(sapply(z, function(x){max(x$x)})))
ylim <- c(min(sapply(z, function(x){min(x$y)})),
max(sapply(z, function(x){max(x$y)})))
z[[i]]$z.uncor@data@values <- matrix(data = z[[i]]$z.uncor@data@values, nrow = R, ncol = R, byrow = TRUE)
z[[i]]$Z@data@values <- matrix(data = z[[i]]$Z@data@values, nrow = R, ncol = R, byrow = TRUE)
image(z[[i]]$x, z[[i]]$y, z[[i]]$z.uncor@data@values, col = "transparent",
ylim = ylim, xlim = xlim,
zlim = c(0.000001, max(z[[1]]$Z@data@values, na.rm = T)),
xlab = "PC1", ylab = "PC2",cex.lab = 1.5,
cex.axis = 1.4,
add = add.plots)
abline(h = 0, v = 0, lty = 2)
box()
title(title)
if (back) {
contour(z[[i]]$x, z[[i]]$y, z[[i]]$Z@data@values, add = back,
levels = quantile(z[[i]]$Z@data@values[z[[i]]$Z@data@values > 0], probs = 1-prob.back.1),
drawlabels = FALSE,lty =1,
col = g.colors[i], lwd = line.width.back)
contour(z[[i]]$x, z[[i]]$y, z[[i]]$Z@data@values, add = back,
levels = quantile(z[[i]]$Z@data@values[z[[i]]$Z@data@values > 0], probs = 1-prob.back.2),
drawlabels = FALSE,lty =2,
col = g.colors[i], lwd = line.width.back)
}
if (densidade) {
densidade.value <- quantile(z[[i]]$z.uncor@data@values[z[[i]]$z.uncor@data@values > 0],probs = 1-prob.dens)
densidade.quantile <- z[[i]]$z.uncor@data@values
densidade.quantile[densidade.quantile < densidade.value] <- 0
densidade.quantile <- matrix(data = densidade.quantile, nrow = R, ncol = R, byrow = FALSE)
image(z[[i]]$x, z[[i]]$y, densidade.quantile, col = a(n.degradation+1), add = densidade)
}
if(contornar){
contour(z[[i]]$x, z[[i]]$y, z[[i]]$z.uncor@data@values,
add = contornar,
levels = quantile(z[[i]]$z.uncor@data@values[z[[i]]$z.uncor@data@values > 0],probs = 1-prob.dens),
drawlabels = FALSE,
col = g.colors[i],
lwd = line.width.dens, lty = 1)
}
}
for(i in 1:n.groups) {
plot.niche.all(z, n.groups, g.names,
densidade = TRUE,
n.degradation = 1000,
slope.degradation = 100,
contornar = FALSE,
prob.dens = 0.5,
line.width.dens = 2,
back = TRUE,
prob.back.1 = 1,
prob.back.2 = 0.5,
line.width.back = 2,
title = g.names[i],
g.colors,
add.plots = FALSE, i)
}
for(i in 1:n.groups) {
if (i==1){ add.plots <- FALSE }
else { add.plots <- TRUE}
plot.niche.all(z, n.groups, g.names,
densidade = TRUE,
n.degradation = 1000,
slope.degradation = 100,
contornar = TRUE,
prob.dens = 0.2,
line.width.dens = 2,
back = FALSE,
prob.back.1 = 1,
prob.back.2 = 0.5,
line.width.back = 2,
title = "Densities",
g.colors,
add.plots = add.plots, i)
}
for(i in 1:n.groups) {
if (i==1){ add.plots <- FALSE }
else { add.plots <- TRUE}
plot.niche.all(z, n.groups, g.names,
densidade = TRUE,
n.degradation = 1000,
slope.degradation = 100,
contornar = TRUE,
prob.dens = 0.98,
line.width.dens = 1,
back = TRUE,
prob.back.1 = 0.98,
prob.back.2 = FALSE,
line.width.back = 3,
title = "Densities and Background",
g.colors,
add.plots = add.plots, i)
}
loadings <- cbind(cor(data.env, pca.cal$tab[,1]), cor(data.env, pca.cal$tab[,2]))
colnames(loadings) <- c("axis1", "axis2")
barplot(loadings[,1], las=2, main="PC1")
barplot(loadings[,2], las=2, main="PC2")
contrib <- pca.cal$co
eigen <- pca.cal$eig
nomes <- gsub(paste(variables.path,'/', sep=""),'',list.variables)
nomes <- gsub(variables.file.type,'',nomes)
s.corcircle(contrib[, 1:2] / max(abs(contrib[, 1:2])), grid = F, label = nomes, clabel = 1.2)
text(0, -1.1, paste("PC1 (", round(eigen[1]/sum(eigen)*100,2),"%)", sep = ""))
text(1.1, 0, paste("PC2 (", round(eigen[2]/sum(eigen)*100,2),"%)", sep = ""), srt = 90)